package com.boilerCloud.dao.sys.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Repository;

import com.boilerCloud.dao.sys.IHzlqswRoleDao;
import com.boilerCloud.dto.sys.Role;
import com.boilerCloud.util.SQLUtil;

/**
 * @类功能说明：角色操作数据层
 * @类修改者：
 * @修改日期：
 * @修改说明：
 * @公司名称：杭州龙骞科技有限公司
 * @作者：qianfuqiang
 * @创建时间：2013-3-17 下午10:39:12
 * @版本：V1.0
 */
@Repository
public class HzlqswRoleDaoImpl implements IHzlqswRoleDao {
	@Resource
	private JdbcTemplate jdbcTemplate;
	private static final Logger log = LoggerFactory.getLogger(HzlqswRoleDaoImpl.class);

	/**
	 * @函数功能说明:添加用户角色表
	 * @创建者：qianfuqiang 2013-8-9
	 * @修改者：
	 * @修改内容：
	 * @参数： @param uID
	 * @参数： @param roleID
	 * @参数： @throws Exception
	 * @返回： void
	 * @抛出异常：
	 */
	public void addUserRole(long uID, int roleID) throws Exception {
		log.info("进入添加用户角色关系表");
		String sql = "insert into lqsw_b2c_sys_user_role(U_ID,ROLEID) values(?,?)";
		this.jdbcTemplate.update(sql, new Object[] { uID, roleID });
	}

	/**
	 * @函数功能说明:编辑用户角色表
	 * @创建者：miaochao 2013-10-16
	 * @修改者：
	 * @修改内容：
	 * @参数： @param uID
	 * @参数： @param roleID
	 * @参数： @throws Exception
	 * @返回： void
	 * @抛出异常：
	 */
	public void editUserRole(long U_ID, int roleID) throws Exception {
		log.info("编辑用户角色关系表");
		String sql = "UPDATE lqsw_b2c_sys_user_role SET ROLEID=? WHERE U_ID=?";
		this.jdbcTemplate.update(sql, new Object[] { roleID, U_ID });
	}

	/**
	 * 删除用户角色数据
	 * 
	 * @param U_ID
	 * @throws Exception
	 */
	public void delUserRole(int U_ID) throws Exception {
		log.info("删除用户角色关系表");
		String sql = "delete from lqsw_b2c_sys_user_role WHERE U_ID=?";
		this.jdbcTemplate.update(sql, new Object[] { U_ID });
	}

	/**
	 * @函数功能说明:查询角色列表信息
	 * @创建者：qianfuqiang 2013-7-1
	 * @修改者：
	 * @修改内容：
	 * @参数： @param offset 分页起始数
	 * @参数： @param length 每页数量
	 * @参数： @param role 角色
	 * @参数： @return
	 * @参数： @throws Exception
	 * @返回： List<Role>
	 * @抛出异常：
	 */
	public List<Role> qryRoleList(int offset, int length, Role role) throws Exception {
		String sql = "SELECT ID,ROLENAME,CREATETIME,LASTUPDATE,REMARKS FROM lqsw_b2c_sys_role  WHERE STATUS=1";
		List<Object> sqlParams = new ArrayList<Object>();
		if (!role.getROLENAME().isEmpty()) {
			sql = sql + " AND ROLENAME like ?";
			sqlParams.add("%" + role.getROLENAME() + "%");
		}
		if(role.getOrganizationId() != 0){
			sql += " and organization_id=?";
			sqlParams.add(role.getOrganizationId());
		}
		sql = sql + " ORDER BY ID DESC";
		sql = SQLUtil.getPageSQL(sql, offset, length, SQLUtil.DBMS_MYSQL_TYPE);
		List<Role> roles = new ArrayList<Role>();
		roles = this.jdbcTemplate.query(sql, sqlParams.toArray(new Object[sqlParams.size()]), new RoleRowMapper());
		return roles;
	}

	class RoleRowMapper implements RowMapper<Role> {
		public Role mapRow(ResultSet rs, int rowNum) throws SQLException {
			Role role = new Role();
			role.setID(rs.getInt("ID"));
			role.setROLENAME(rs.getString("ROLENAME"));
			role.setCREATETIME(rs.getTimestamp("CREATETIME"));
			role.setLASTUPDATE(rs.getTimestamp("LASTUPDATE"));
			role.setREMARKS(rs.getString("REMARKS"));
			return role;
		}
	}

	/**
	 * @函数功能说明：获取角色列表数量
	 * @创建者：qianfuqiang 2013-7-1
	 * @修改者：
	 * @修改内容：
	 * @参数： @param role
	 * @参数： @return
	 * @参数： @throws Exception
	 * @返回： int
	 * @抛出异常：
	 */
	@SuppressWarnings("deprecation")
	public int qryRoleListSize(Role role) throws Exception {
		String sql = "SELECT COUNT(1) FROM lqsw_b2c_sys_role WHERE STATUS=1";
		List<Object> sqlParams = new ArrayList<Object>();
		if (!role.getROLENAME().isEmpty()) {
			sql = sql + " AND ROLENAME like ?";
			sqlParams.add("%" + role.getROLENAME() + "%");
		}
		if(role.getOrganizationId() != 0){
			sql += " and organization_id=?";
			sqlParams.add(role.getOrganizationId());
		}
		return this.jdbcTemplate.queryForObject(sql, Integer.class, sqlParams.toArray(new Object[sqlParams.size()]));
	}

	/**
	 * @函数功能说明:添加角色
	 * @创建者：qianfuqiang 2013-8-13
	 * @修改者：
	 * @修改内容：
	 * @参数： @param role
	 * @参数： @throws Exception
	 * @返回： void
	 * @抛出异常：
	 */
	public int addRole(final Role role) throws Exception {
		KeyHolder keyHolder = new GeneratedKeyHolder();
		final String sql = "INSERT INTO lqsw_b2c_sys_role(ROLENAME,CREATETIME,LASTUPDATE,STATUS,REMARKS) VALUES(?,now(),now(),1,?)";
		this.jdbcTemplate.update(new PreparedStatementCreator() {
			public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
				PreparedStatement ps = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
				ps.setString(1, role.getROLENAME());
				ps.setString(2, role.getREMARKS());
		
				return ps;
			}
		}, keyHolder);
		return keyHolder.getKey().intValue();
	}

	/**
	 * @函数功能说明:添加角色菜单表
	 * @创建者：qianfuqiang 2013-8-13
	 * @修改者：
	 * @修改内容：
	 * @参数： @param roleID
	 * @参数： @param menuIDs
	 * @参数： @throws Exception
	 * @返回： void
	 * @抛出异常：
	 */
	public void addRoleMenu(final int roleID, final String[] menuIDs) throws Exception {
		String sql = "INSERT INTO lqsw_b2c_sys_role_menu(ROLEID,MENUID) VALUES(?,?)";
		this.jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
			public int getBatchSize() {
				return menuIDs.length;
			}

			public void setValues(PreparedStatement ps, int i) throws SQLException {
				ps.setInt(1, roleID);
				ps.setInt(2, Integer.parseInt(menuIDs[i]));
			}
		});
	}

	/**
	 * @函数功能说明:添加角色菜单表-单条
	 * @创建者：qianfuqiang 2013-8-14
	 * @修改者：
	 * @修改内容：
	 * @参数： @param roleID
	 * @参数： @param menuID
	 * @参数： @throws Exception
	 * @返回： void
	 * @抛出异常：
	 */
	public void addRoleMen(int roleID, int menuID) throws Exception {
		String sql = "INSERT INTO lqsw_b2c_sys_role_menu(ROLEID,MENUID) VALUES(?,?)";
		this.jdbcTemplate.update(sql, new Object[] { roleID, menuID });
	}

	/**
	 * @函数功能说明:删除角色
	 * @创建者：qianfuqiang 2013-8-13
	 * @修改者：
	 * @修改内容：
	 * @参数： @param roleID
	 * @参数： @throws Exception
	 * @返回： void
	 * @抛出异常：
	 */
	public void delRole(int roleID) throws Exception {
		String sql = "UPDATE lqsw_b2c_sys_role SET STATUS=0 WHERE ID=?";
		this.jdbcTemplate.update(sql, new Object[] { roleID });
	}

	/**
	 * @函数功能说明:删除角色菜单表---删除角色时用
	 * @创建者：qianfuqiang 2013-8-13
	 * @修改者：
	 * @修改内容：
	 * @参数： @param roleID
	 * @参数： @throws Exception
	 * @返回： void
	 * @抛出异常：
	 */
	public void delRoleMenu(int roleID) throws Exception {
		String sql = "DELETE FROM lqsw_b2c_sys_role_menu WHERE ROLEID=?";
		this.jdbcTemplate.update(sql, new Object[] { roleID });
	}

	/**
	 * 删除角色菜单表-根据菜单编号删除
	 * 
	 * @函数功能说明:
	 * @创建者：qianfuqiang 2013-8-14
	 * @修改者：
	 * @修改内容：
	 * @参数： @param menuID
	 * @参数： @throws Exception
	 * @返回： void
	 * @抛出异常：
	 */
	public void delRoleMenuByMenuID(int menuID) throws Exception {
		String sql = "DELETE FROM lqsw_b2c_sys_role_menu WHERE MENUID=?";
		this.jdbcTemplate.update(sql, new Object[] { menuID });
	}

	/**
	 * @函数功能说明:根据角色编号查找用户能用的菜单ID
	 * @创建者：qianfuqiang 2013-8-14
	 * @修改者：
	 * @修改内容：
	 * @参数： @param roleID
	 * @参数： @return
	 * @参数： @throws Exception
	 * @返回： String[]
	 * @抛出异常：
	 */
	public String[] getMenuIDByRole(int roleID) throws Exception {
		log.info("根据角色编号查找用户能用的菜单ID,角色编号=" + roleID);
		String sql = "SELECT MENUID FROM lqsw_b2c_sys_role_menu WHERE ROLEID=?";
		List<String> list = this.jdbcTemplate.queryForList(sql, String.class, new Object[] { roleID });
		if (!list.isEmpty()) {
			return (String[]) list.toArray(new String[list.size()]);
		} else {
			return null;
		}
	}

	/**
	 * @函数功能说明:删除角色菜单表---修改角色时用
	 * @创建者：qianfuqiang 2013-8-14
	 * @修改者：
	 * @修改内容：
	 * @参数： @param roleID
	 * @参数： @throws Exception
	 * @返回： void
	 * @抛出异常：
	 */
	public void delRoleMenu(int roleID, String viewmenuid) throws Exception {
		String sql = "DELETE FROM lqsw_b2c_sys_role_menu WHERE ROLEID=? AND MENUID IN(" + viewmenuid + ")";
		this.jdbcTemplate.update(sql, new Object[] { roleID });
	}

	/**
	 * @函数功能说明:更新角色表
	 * @创建者：qianfuqiang 2013-8-14
	 * @修改者：
	 * @修改内容：
	 * @参数： @param role
	 * @参数： @throws Exception
	 * @返回： void
	 * @抛出异常：
	 */
	public void updateRole(Role role) throws Exception {
		String sql = "UPDATE lqsw_b2c_sys_role SET ROLENAME=?,LASTUPDATE=now(),REMARKS=? WHERE ID=?";
		this.jdbcTemplate.update(sql, new Object[] { role.getROLENAME(),role.getREMARKS(), role.getID() });
	}

	/**
	 * 查询角色列表
	 * 
	 * @return
	 * @throws Exception
	 */
	public List<Role> qryRoles(int or_id) throws Exception {
		String sql = "SELECT ID,ROLENAME,CREATETIME,LASTUPDATE,REMARKS FROM lqsw_b2c_sys_role WHERE STATUS=1  ORDER BY ID DESC";
		List<Role> roles = new ArrayList<Role>();
		roles = this.jdbcTemplate.query(sql, new RoleRowMapper());
		return roles;
	}
	
	/**
	 * 查询鄞州旅游下的角色列表
	 * @return
	 * @throws Exception
	 */
	@Override
	public List<Role> qryRolesOfInZhou() throws Exception {
		String sql = "SELECT ID,ROLENAME,CREATETIME,LASTUPDATE FROM lqsw_b2c_sys_role WHERE STATUS=1 AND ROLENAME LIKE '%鄞州%' ORDER BY ID DESC";
		List<Role> roles = new ArrayList<Role>();
		roles = this.jdbcTemplate.query(sql, new RoleRowMapper());
		return roles;
	}
}
